﻿using System;
using System.CodeDom;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Web.UI;
using System.Web.UI.WebControls;
using Rezepto.Account;
using Rezepto.DatenbankObjekte;
using Rezepto.DatenbankVerbindung;

namespace Rezepto
{
    public partial class RezeptSuche : LoginPage
    {

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                var query = Request.Params.Get("query") ?? string.Empty;
                Query.Text = query;
                var rezeptListe = OracleVerbindung.SucheRezepte(query);
                if (rezeptListe.Count > 0)
                {
                    Sucherergbnis.Visible = true;
                    Sucherergbnis.Text += " (" + rezeptListe.Count + ") ";
                    BuildRezeptDataResultSet(rezeptListe);
                }
                else
                {
                    Sucherergbnis.Visible = false;
                    if (query != String.Empty)
                    {
                        Sucherergbnis.Visible = true;
                        Sucherergbnis.Text = "Keine Rezepte gefunden.";
                    }
                    
                }
                
            }
        }

        private void BuildRezeptDataResultSet(List<Rezept> rezeptListe)
        {
            InitializeBorderStyle();
            InitializeResultTableHeader();

            foreach (var rezept in rezeptListe)
            {
                var dataRow = new TableRow();
                var rezeptNameData = new TableCell();
                var bildData = new TableCell();
                var kategorieData = new TableCell();
                var bewertungData = new TableCell();
                var vorschauRezeptBild = new Image();
                HyperLink rezeptHyperlink = new HyperLink();

                rezeptHyperlink.NavigateUrl = "Default.aspx?rezeptid=" + rezept.RezeptId;
                rezeptHyperlink.Text = rezept.RezeptName;
                

                SetPreviewRecipePicture(vorschauRezeptBild, rezept);
                SetRatingPictures(bewertungData, rezept.Bewertung, false);

                rezeptNameData.Controls.Add(rezeptHyperlink);
                bildData.Controls.Add(vorschauRezeptBild);
                kategorieData.Text = rezept.Kategorie.ToString();
                dataRow.Cells.Add(rezeptNameData);
                dataRow.Cells.Add(kategorieData);
                dataRow.Cells.Add(bewertungData);
                dataRow.Cells.Add(bildData);
                RezeptResult.Rows.Add(dataRow);
            }
        }

        private void InitializeBorderStyle()
        {
            RezeptResult.BorderStyle = BorderStyle.Solid;
            RezeptResult.BorderWidth = new Unit(1, UnitType.Pixel);
        }

        public static void SetRatingPictures(Control bewertungData, decimal bewertung, bool withRating)
        {
            var origingoodRating = bewertung*2;
            origingoodRating = (Math.Round(origingoodRating, MidpointRounding.AwayFromZero)) / 2;
            var halfRated = Math.Truncate(origingoodRating) == origingoodRating ? 0 : 1;
            var goodRating = origingoodRating - halfRated;
            decimal badRating = 5 - origingoodRating - halfRated;
            int rating = 1;
            for (int i = 0; i < goodRating; i++)
            {
                var image = new Image();
                image.ImageUrl = "~/Pics/löffel-goldkl.png";
                image.ID = "Bewertung" + rating;
                if (withRating)
                {
                    image.Attributes.Add("onmouseover", "SetRatingIcons(this.id)");
                    image.Attributes.Add("onmouseout", "ResetRatingIcons()");
                    image.Attributes.Add("onclick", "RateRecipeAndUpdateRating(this.id)");
                    image.Attributes.Add("style", "cursor: pointer;");
                }
                bewertungData.Controls.Add(image);
                rating++;
            }
            for (int i = 0; i < halfRated; i ++)
            {
                var image = new Image();
                image.ImageUrl = "~/Pics/löffel-halfkl.png";
                image.ID = "Bewertung" + rating;
                if (withRating)
                {
                    image.Attributes.Add("onmouseover", "SetRatingIcons(this.id)");
                    image.Attributes.Add("onmouseout", "ResetRatingIcons()");
                    image.Attributes.Add("onclick", "RateRecipeAndUpdateRating(this.id)");
                    image.Attributes.Add("style", "cursor: pointer;");
                }
                bewertungData.Controls.Add(image);
                rating++;
            }
            for (int i = 0; i < badRating; i++)
            {
                var image = new Image();
                image.ImageUrl = "~/Pics/löffel-graukl.png";
                image.ID = "Bewertung" + rating;
                if (withRating)
                {
                    image.Attributes.Add("onmouseover", "SetRatingIcons(this.id)");
                    image.Attributes.Add("onmouseout", "ResetRatingIcons()");
                    image.Attributes.Add("onclick", "RateRecipeAndUpdateRating(this.id)");
                    image.Attributes.Add("style", "cursor: pointer;");
                }
                bewertungData.Controls.Add(image);
                rating++;
            }
            
        }

        private static void SetPreviewRecipePicture(Image vorschauRezeptBild, Rezept rezept)
        {
            vorschauRezeptBild.Width = 120;
            vorschauRezeptBild.Height = 90;
            if (rezept.Bilder.Count > 0)
            {
                string base64String = Convert.ToBase64String(rezept.Bilder.First(), 0, rezept.Bilder.First().Length);
                vorschauRezeptBild.ImageUrl = "data:image/png;base64," + base64String;
            }
            else
            {
                vorschauRezeptBild.ImageUrl = "~/Pics/keinbildkl.png";
            }
        }

        private void InitializeResultTableHeader()
        {
            var headerRow = new TableHeaderRow();

            var rezeptNameHeader = new TableHeaderCell();
            var kategorieHeader = new TableHeaderCell();
            var bewertungHeader = new TableHeaderCell();
            var bildHeader = new TableHeaderCell();
            rezeptNameHeader.Text = "Rezept";
            kategorieHeader.Text = "Kategorie";
            bewertungHeader.Text = "Bewertung";
            bildHeader.Text = "Bild";
            headerRow.Cells.Add(rezeptNameHeader);
            headerRow.Cells.Add(kategorieHeader);
            headerRow.Cells.Add(bewertungHeader);
            headerRow.Cells.Add(bildHeader);
            RezeptResult.Rows.Add(headerRow);
        }

        protected void RezeptSuchen(object sender, EventArgs e)
        {
            Response.Redirect("RezeptSuche.aspx?query="+Query.Text);
        }
    }
}